#导入需要的库
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from matplotlib.lines import Line2D #用于创建自定义图例
#加载本地数据集，从csv文件中读取数据
data = pd.read_csv('C://Users//yjyang24//Desktop//第八章//第8章案例//案例1//dataset//data.csv',encoding='GBK')#data.csv为本地数据集，encoding为文件编码类型（文件编码类型针对不同文件会有不同的设置，默认为'utf-8'）
#设置sns的绘制风格
sns.set_style("white")
#将读取的文件转换为dataframe格式
df = pd.DataFrame(data)
# 设置 matplotlib 支持中文显示
plt.rcParams['font.sans-serif'] = ['SimHei'] # 指定中文字体为 SimHei
plt.rcParams['axes.unicode_minus'] = False # 解决负号显示问题
# 绘制折线图
plt.figure(figsize=(12, 6))
# 绘制折线图
sns.lineplot(data=df, x='年份', y='城市标化发病率', marker='x', label='城市', linestyle='-')
sns.lineplot(data=df, x='年份', y='农村标化发病率', marker='', label='农村', linestyle='-')
sns.lineplot(data=df, x='年份', y='全国标化发病率', marker='s', label='全国', linestyle='-')
# 统一设置点的大小，同时保持原有的标记形状
point_size = 80 # 设置点的大小
# 设置城市标化发病率的点形状与大小
plt.scatter(df['年份'], df['城市标化发病率'], s=point_size, color='C0', marker='x', zorder=5)
# 设置全国标化发病率的点形状与大小（未设置农村标化发病率的点形状与大小是因为设置其线条为直线，不需要额外设置点）
plt.scatter(df['年份'], df['全国标化发病率'], s=point_size, color='C2', marker='s', zorder=5)
# 添加标题和标签
plt.title('2005-2013年中国女性乳腺癌标化发病率',fontsize=16)
plt.xlabel('年份',fontsize=14)
plt.ylabel('标化发病率',fontsize=14)
# 创建自定义图例句柄
legend_handles = [
    Line2D([0], [0], marker='x', color='C0', label='城市', markerfacecolor='C0', markersize=10),
    Line2D([0], [0], marker='', color='C1', label='农村', markersize=10),
    Line2D([0], [0], marker='s', color='C2', label='全国', markerfacecolor='C2', markersize=10)
]
# 添加自定义图例
plt.legend(handles=legend_handles)
# 显示图形
plt.show()